﻿// 4551. 猪猪存钱罐.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <cstring>

using namespace std;
/*
https://www.acwing.com/problem/content/4554/


猪猪存钱罐里有很多硬币。

已知每种硬币的单个具体重量以及存钱罐中所有硬币的净重。

请你预估计算一下，存钱罐内所有硬币的总金额的最小可能值。

输入格式
第一行包含整数 T，表示共有 T 组测试数据。

每组数据第一行包含两个整数 E 和 F
，分别表示猪猪存钱罐的空罐重量以及实际重量。

第二行包含整数 N，表示共有 N 种硬币。

接下来 N 行，每行包含两个整数 P,W
，表示其中一种硬币的面值为 P，重量为 W。

输出格式
每组数据输出一行答案，格式为 The minimum amount of money in the piggy-bank is X.，其中 X
 为总金额的最小可能值，如果无解（根本不可能恰好凑出给定的硬币总重量），则输出 This is impossible.。

数据范围
1≤T≤10
,
1≤E≤F≤10000
,
1≤N≤500
,
1≤P≤50000
,
1≤W≤10000
。

输入样例：
3
10 110
2
1 1
30 50
10 110
2
1 1
50 30
1 6
2
10 3
20 4
输出样例：
The minimum amount of money in the piggy-bank is 60.
The minimum amount of money in the piggy-bank is 100.
This is impossible.
*/
const int N = 505, M = 10010;
int dp[2][M];
int t;
int e, f, n;

struct COIN {
    int p, w;
}coins[N];

void solve() {
    cin >> e >> f;
    e = f - e; f = e;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> coins[i].p >> coins[i].w;
    }
    memset(dp, 0x3f, sizeof dp);
    dp[0][0] = 0;
    int curr = 1; int prev = 0;
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j <= e; j++) {
            dp[curr][j] = dp[prev][j];
            if(j >= coins[i].w)
                dp[curr][j] = min(dp[curr][j], dp[curr][j - coins[i].w] + coins[i].p);
        }
        swap(curr, prev);
    }

    if (dp[prev][f] == 0x3f3f3f3f) {
        cout << "This is impossible." << endl;
    }
    else {
        cout << "The minimum amount of money in the piggy-bank is " << dp[prev][f] << "." << endl;
    }
}

int main()
{
    cin >> t;

    while (t--) {
        solve();
    }

    return 0;
}

 